/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import detalhamentoEntrada.DetalhamentoEntrada;
import entrada.CadastroEntrada;
import entrada.Entrada;
import entrada.RepositorioEntrada;
import java.sql.Date;
import java.util.List;
import util.CamposInvalidosException;
import util.CamposObrigatoriosException;
import util.Util;

/**
 *
 * @author Alberto
 */
public class ControladorEntrada {
    
    RepositorioEntrada objRepositorioEntrada = null;
    
    /**
     * Método construtor
     * @param objRepositorioEntrada 
     */
    public ControladorEntrada(RepositorioEntrada objRepositorioEntrada) {
        this.objRepositorioEntrada = objRepositorioEntrada;
    }
    
    
    /**
     * Método que ira cadastrar a entrada de materiais na base
     * 
     * @param objEntrada
     * @return int idEntrada
     * @throws Exception 
     */
    public int inserirEntrada(Entrada objEntrada)throws Exception{
        
        // Iniciando os cadastros
        CadastroEntrada objCadastroEntrada = new CadastroEntrada(this.objRepositorioEntrada);
        
        // VALIDAÇÕES OBJETO ENTRADA
        if(objEntrada.getBaseCalculoIcms() == 0) throw new CamposObrigatoriosException("Base Calculo ICMS");
//        if(objEntrada.getCalculoIcmsSubstituicao() == 0) throw new CamposObrigatoriosException("Calculo ICMS Substituição");
//        if(objEntrada.getCustoFrete() == 0) throw new CamposObrigatoriosException("Calculo ICMS Substituição");
        if(objEntrada.getDataEmissao().toString().trim().length() == 0) throw new CamposObrigatoriosException("Data Emissão");
        if(objEntrada.getDataEntrada().toString().trim().length() == 0) throw new CamposObrigatoriosException("Data Entrada");
//        if(objEntrada.getDesconto() == 0) throw new CamposObrigatoriosException("Calculo ICMS Substituição");
        if(objEntrada.getNumeroNota().trim().length() == 0) throw new CamposObrigatoriosException("Numero Nota");
//        if(objEntrada.getOutrasDespesas() == 0) throw new CamposObrigatoriosException("Calculo ICMS Substituição");
//        if(objEntrada.getQtdProdutosNota() == 0) throw new CamposObrigatoriosException("QTD Produtos Nota");
        if(objEntrada.getSerie().trim().length() == 0) throw new CamposObrigatoriosException("Serie");
//        if(objEntrada.getSubserie().trim().length() == 0) throw new CamposObrigatoriosException("Sub Serie");
        if(objEntrada.getTipoNota() == 0) throw new CamposObrigatoriosException("Tipo Nota");
        if(objEntrada.getTotalNotas() == 0) throw new CamposObrigatoriosException("Total Nota");
//        if(objEntrada.getTotalProdutos() == 0) throw new CamposObrigatoriosException("Quantidade");
//        if(objEntrada.getValorFrete() == 0) throw new CamposObrigatoriosException("Valor Frete");
        if(objEntrada.getValorIcms() == 0) throw new CamposObrigatoriosException("Valor ICMS");
//        if(objEntrada.getValorIcmsSubstituicao() == 0) throw new CamposObrigatoriosException("Valor ICMS Substituição");
//        if(objEntrada.getValorIpi() == 0) throw new CamposObrigatoriosException("Valor IPI");
//        if(objEntrada.getValorSeguro() == 0) throw new CamposObrigatoriosException("Valor Seguro");
        if(objEntrada.getFuncionario() == null) throw new CamposObrigatoriosException("Funcionario");
        if(objEntrada.getFornecedor() == null) throw new CamposObrigatoriosException("Fornecedor");
        if(objEntrada.getNaturezaOperacao() == null) throw new CamposObrigatoriosException("Natureza Operação");
        
        // Validando os campos
        if(!Util.verificaData(Util.formatarBancoData(objEntrada.getDataEmissao().toString()))) throw new CamposInvalidosException("Data Emissão");
        if(!Util.verificaData(Util.formatarBancoData(objEntrada.getDataEntrada().toString()))) throw new CamposInvalidosException("Data Entrada");
        
        // Declarando a variavel que contera o valor total dos produtos no detalhamento
        double valorTotalDetalhamento = 0;
        
        System.out.println("Validação Entrada");
        // VALIDAÇÕES DA LISTA OBJETO DETALHAMENTO ENTRADA
        for(DetalhamentoEntrada objDetalhamentoEntrada : objEntrada.getDetalhamentoEntradas()){
            if(objDetalhamentoEntrada.getBaseIcms() == 0) throw new CamposObrigatoriosException("Base ICMS Detalhamento Entrada");
            if(objDetalhamentoEntrada.getCfop().trim().length() == 0) throw new CamposObrigatoriosException("CFOP Detalhamento Entrada");
            if(objDetalhamentoEntrada.getCst().trim().length() == 0) throw new CamposObrigatoriosException("CST Detalhamento Entrada");
            if(objDetalhamentoEntrada.getDescricaoProduto() == null) throw new CamposObrigatoriosException("Descrição Produto Detalhamento Entrada");
            if(objDetalhamentoEntrada.getNcmSh().trim().length() == 0) throw new CamposObrigatoriosException("NCM / SH Detalhamento Entrada");
            if(objDetalhamentoEntrada.getPorcentagemIcms() == 0) throw new CamposObrigatoriosException("Porcentagem ICMS Detalhamento Entrada");
            if(objDetalhamentoEntrada.getPorcentagemIpi() == 0) throw new CamposObrigatoriosException("Porcentagem IPI Detalhamento Entrada");
            if(objDetalhamentoEntrada.getQtdProduto() == 0) throw new CamposObrigatoriosException("Quantidade de produto Detalhamento Entrada");
            if(objDetalhamentoEntrada.getValorIcms() == 0) throw new CamposObrigatoriosException("Valor ICMS Detalhamento Entrada");
            if(objDetalhamentoEntrada.getValorIpi() == 0) throw new CamposObrigatoriosException("Valor IPI Detalhamento Entrada");
            if(objDetalhamentoEntrada.getValorTotal() == 0) throw new CamposObrigatoriosException("Valor Total Detalhamento Entrada");
            if(objDetalhamentoEntrada.getValorUnidade() == 0) throw new CamposObrigatoriosException("Valor Unidade Detalhamento Entrada");
            
            // Somando os valores
            valorTotalDetalhamento += objDetalhamentoEntrada.getValorTotal();
            
            // Validando o valor da compra com o valor informado no detalhamento entrada
            if(!objDetalhamentoEntrada.getValorTotal().equals(objDetalhamentoEntrada.getCompra().getValorCompra())) throw new Exception("O valor Total do detalhamento " + objDetalhamentoEntrada.getValorTotal() + " entrada está diferente do valor informado para a compra " + objDetalhamentoEntrada.getCompra().getValorCompra() + " dos produtos: " + objDetalhamentoEntrada.getDescricaoProduto().getDecsricaoProduto());
            if(!objDetalhamentoEntrada.getQtdProduto().equals(objDetalhamentoEntrada.getCompra().getQtdProduto())) throw new Exception("A quantidade de produtos informada no detalhamento entrada não condiz com o informado para a compra dos produtos: " + objDetalhamentoEntrada.getDescricaoProduto().getDecsricaoProduto());
        }
        
        if(valorTotalDetalhamento != objEntrada.getTotalNotas()) throw new Exception("Valor Total é diferente do valor Total dos itens informado no detalhamento Entrada!");
        
        return objCadastroEntrada.inserirEntrada(objEntrada);
    }
    
    /**
     * Método que ira cancelar a entrada de materiais na base
     * 
     * @param objEntrada
     * @return int idEntrada
     * @throws Exception 
     */
    public int cancelarEntrada(Entrada objEntrada) throws Exception{
        // Iniciando os cadastros
        CadastroEntrada objCadastroEntrada = new CadastroEntrada(this.objRepositorioEntrada);
        
        // VALIDAÇÕES OBJETO ENTRADA
        if(objEntrada.getIdEntrada() == 0) throw new CamposInvalidosException("Entrada");
        
        
        // VALIDAÇÕES DA LISTA OBJETO DETALHAMENTO ENTRADA
        for(DetalhamentoEntrada objDetalhamentoEntrada : objEntrada.getDetalhamentoEntradas()){
            if(objDetalhamentoEntrada.getIdDetalhamanetoEntrada() == 0) throw new CamposInvalidosException("Detalhamento Entrada");
        }
        
        
        // Cancelando as entradas materiais
        return objCadastroEntrada.cancelarEntrada(objEntrada);
    }
    
    /**
     * List<Entrada>
     * 
     * @return 
     */
    public List<Entrada> listarEntradas() throws Exception{
        // Iniciando os cadastros
        CadastroEntrada objCadastroEntrada = new CadastroEntrada(this.objRepositorioEntrada);
        
        return objCadastroEntrada.listarEntradas();
    }
    
    
    /**
     * Método que ira buscar a entrada na base pelo seu Identificador
     * 
     * @param idEntrada
     * @return Entrada
     * @throws Exception 
     */
    public Entrada procurarEntrada(int idEntrada)throws Exception{
         // Iniciando os cadastros
        CadastroEntrada objCadastroEntrada = new CadastroEntrada(this.objRepositorioEntrada);
        
        return objCadastroEntrada.procurarEntrada(idEntrada);
    }
    
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<Entrada> listarPorFornecedorPorFuncionarioPorData(int idFornecedor, int idFuncionario, Date dataInicial, Date dataFinal) throws Exception {
         // Iniciando os cadastros
        CadastroEntrada objCadastroEntrada = new CadastroEntrada(this.objRepositorioEntrada);
        
        return objCadastroEntrada.listarPorFornecedorPorFuncionarioPorData(idFornecedor, idFuncionario, dataInicial, dataFinal);
    }
}